﻿/*
 * datatype.h
 *
 *  Created on: 2020年5月3日
 *      Author: root
 */

#ifndef SRC_DATATYPE_H_
#define SRC_DATATYPE_H_
//---------------------------------------------------------------------------

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/time.h>
//---------------------------------------------------------------------------

#define FRMHDR				0x0A			//帧头标识A
#define FRMTAIL				0x0B			//帧尾标识B
#define MAXBINSIZE			512				//帧数据最大长度
#define MAXASCSIZE			1024			//帧数据最大长度（转16进制ASCII码后）

//---------------------------------------------------------------------------

#ifndef HANDLE
	typedef void * HANDLE;
#endif

#ifndef BYTE
	typedef unsigned char BYTE;
#endif

#ifndef uint16
	typedef unsigned short uint16;
#endif

#ifndef uint32
	typedef unsigned int uint32;
#endif

#ifndef UINT32
	typedef unsigned int UINT32;
#endif

#ifndef L_TIME
typedef struct timeval L_TIME;
#endif
//---------------------------------------------------------------------------

enum MDCSTATUS				//MDC状态
{
	Offline	= 0,			//离线(断开)
	Online	= 1				//在线(正常连接)
};

#pragma pack(push, 1)

typedef struct tagNZLAddr
{
	int	ChlNo;				//枪连接的通道编号：1-16
	int	NZL;				//逻辑枪号：1-254，单站一般枪不会超过64把

	void init() { ChlNo = 0; NZL = 0; }
}TNZLADDR;					//枪地址

typedef struct tagTime
{
	int	Hour;				//时：0-23
	int	Min;				//分：0-59
	int	Sec;				//秒：0-59
}TTIME;

typedef struct tagPiceTime	//上位机授权时段
{
	TTIME tm0;				//开始时间
	TTIME tm1;				//结束时间
}TPICETIME;

typedef struct tagAuthCfg
{
	int	Num;				//上位机授权时段个数
	TPICETIME Items[3];		//授权时段数据
}TAUTHCFG;

typedef struct tagAuthResult
{
	int	ChlNo;				//枪连接的通道编号：1-16
	int	NZL;				//逻辑枪号：1-254，单站一般枪不会超过64把
	int Result;				//授权: 0：成功，1：已授权，2：加油中不能授权，3：枪离线不能授权，4：通道或枪号无效
}TAUTHRESULT;				//取消授权: 0：取消成功，1:无授权，2：取消授权时枪离线不能处理，3：通道或枪号无效

typedef struct tagDateTime
{
	int	Year;				//年：如 2020
	int	Month;				//月：1-12
	int	Day;				//日：1-31
	int	Hour;				//时：0-23
	int	Min;				//分：0-59
	int	Sec;				//秒：0-59

	void init() { Year = 0; Month = 0; Day = 0; Hour = 0; Min = 0; Sec = 0; }
}TDATETIME;					//日期时间

typedef struct tagTimeX
{
	int	Year;				//年：如 2020
	int	Month;				//月：1-12
	int	Day;				//日：1-31
	int	Hour;				//时：0-23
	int	Min;				//分：0-59
	int	Sec;				//秒：0-59
	uint32 USec;			//微秒

	void init() { Year = 0; Month = 0; Day = 0; Hour = 0; Min = 0; Sec = 0; USec = 0; }
}TTIMEX;

typedef struct tagNZLStatus
{
	union
	{
		TNZLADDR NZLAddr;
		struct
		{
			int	ChlNo;		//枪连接的通道编号：1-16
			int	NZL;		//逻辑枪号：1-254，单站一般枪不会超过64把
		};
	};

	int	Status;				//枪状态: 0: 未知状态(初始), 1：空闲，2：卡入，3：加注中，4：锁定，5：离线
	int	VOL;				//当状态为加注中时，表示已加注升数，其他情况无意义
	int	Money;				//当状态为加注中时，表示已加注金额，其他情况无意义

	void init() { ChlNo = 0; NZL = 0; Status = 0; VOL = 0; Money = 0; }
}TNZLSTATUS;				//枪状态信息描述

typedef struct tagTransacton
{
	union
	{
		TNZLADDR	NZLAddr;
		struct
		{
			int	ChlNo;		//枪连接的通道编号：1-16
			int	NZL;		//逻辑枪号：1-254，单站一般枪不会超过64把
		};
	};

	int	OilCode;			//油品编号：采用中石化标准油品代码（见附录）
	int	Price;				//油品单价（分）
	int	VOL;				//油品升数(0.01升为单位，如1.35升，则值为135)
	int	Money;				//金额（分）

	union
	{
		TDATETIME Time;
		struct
		{
			int	Year;		//年：如 2020
			int	Month;		//月：1-12
			int	Day;		//日：1-31
			int	Hour;		//时：0-23
			int	Min;		//分：0-59
			int	Sec;		//秒：0-59
		};
	};

	uint32	VTOT0;			//交易起泵码
	uint32	VTOT1;			//交易止泵码
	uint32	MDCTTC;			//MDC生成的交易流水号1-0xFFFFFFFF，每通道内唯一，不重复
	uint32	PumpTTC;		//油机生成的交易流号（各品牌油机不一样，可能会重复）

	int		CardType;		//卡类型 0：无效，1：员工卡，2：用户卡，3：维修验泵卡
	char	CardNo[21];		//卡号

	void init() { memset( this, 0, sizeof(tagTransacton)); }
}TRANSACTON;				//交易记录信息结构


typedef struct tagNZLOilInfo
{
	union
	{
		TNZLADDR	NZLAddr;
		struct
		{
			int	ChlNo;		//枪连接的通道编号：1-16
			int	NZL;		//逻辑枪号：1-254，单站一般枪不会超过64把
		};
	};

	int	OilCode;			//油品编号：采用中石化标准油品代码（见附录）
	int	Price;				//油品单价（分）
	int	Density;			//密度（g/ml）

	void init() { ChlNo = 0; NZL = 0; OilCode = 0; Price = 0; Density = 0; }
}TNZLOILINFO;				//枪油品信息

typedef struct tagNZLVtot
{
	union
	{
		TNZLADDR	NZLAddr;
		struct
		{
			int	ChlNo;		//枪连接的通道编号：1-16
			int	NZL;		//逻辑枪号：1-254，单站一般枪不会超过64把
		};
	};

	uint32	VTOT;			//枪当前泵码值

	void init() { ChlNo = 0; NZL = 0; VTOT = 0; }
}TNZLVTOT;					//枪泵码信息描述

typedef struct tagMDCTTC
{
	int	ChlNo;				//通道编号：1-16，集线器通讯口编号
	uint32 TTC;				//交易流水号

	void init() { ChlNo = 0; TTC = 0; }
}TMDCTTC;					//通道TTC信息描述

typedef struct tagFrameBin
{
	BYTE	HDR;				//0x0A
	BYTE	Cmd;				//命令编号: 0x00~0xFF
	uint16	DataSize;			//命令数据内容大小
	BYTE	Data[MAXBINSIZE];	//命令数据内容
	uint16	CRC;				//CRC: 包含Cmd,DataSize,Data数据，按中石化标准CRC16算法计算
	BYTE	TAIL;				//0x0B

	void Init()
	{
		memset(this, 0, sizeof(tagFrameBin));
		HDR = FRMHDR;
		TAIL = FRMTAIL;
	}
} TFRAMEBIN;

typedef struct tagDevInfo
{
	char	SN[16];				//产品SN: NL202010001
	char	MDate[10];			//出厂日期: 20200930
}TDEVINFO;

#pragma pack(pop)

const int FRAMEBINSIZE = sizeof(TFRAMEBIN);
//---------------------------------------------------------------------------

//错误信息回调函数，当内部出现错误，向上层调用者反馈
//mdcNo: 注册MDC时标识,如1、2、3、4，分别代表1#、2#、3#、4#MDC；
//pzErrInfo: 零结尾的文本信息，当.so内部出现错误时，可以反馈到上层，知道是发生了什么错误，eg: "Error: Out of memory ..."
typedef void (*TErrorCallback)(int mdcNo, char *pzErrInfo);

//来自MDC业务数据的通知回调函数定义
typedef void (*TOnNotifyEvent)(int mdcNo, int EvtId, BYTE *pData, uint32 uSize);
//EvtId: 代表不同的事件，pData: 事件返回的数据起始地址，uSize: 数据长度
//101: 上传MDC状态，pData：指向MDCSTATUS类弄数据，uSize: 4, 其值为0或1表示断开或连接，状态变更时通知一次，当MDC断开时，其上所有通道连接设备均为断开，此时枪状态不上传；
//102: 枪状态通知回调，pData指向一个TNZLSTATUS结构体，uSize为的TNZLSTATUS结构大小，当枪状态发生变更时会实时上报，加油中大约一秒回调3-5次，当状态未发生改变时，约1分钟回调一次；
//103: 上传交易，pData指向TRANSACTON的结构，uSize为TRANSACTON的结构大小，当有新加交产生时，自动通知一次，如果当时断线或通讯失败，则需要APP主动回叫，回叫后上传的交易，仍以此命令回复；
//104: 上传MDC时间，当APP查询MDC时间时，回复此命令，如果时间与APP所在系统时间有差异时，APP可下发新的日期时间给MDC，以修正交易产生时间，pData为指向TDATETIME的结构，uSize为其长度；
//105: 上传枪油品信息，APP查询时回复，pData指向TNZLOILINFO的结构，uSize为其长度；
//106: 上传枪实时泵码，APP查询时回复，pData指向TNZLVTOT的结构，uSize为其长度；
//107: 上传发送给MDC的协议通讯数据，当成功向MDC发送数据后向上层反馈，pData为数据指针，uSize为其长度；
//108: 上传从MDC收到的协议通讯数据，当成功收到MDC发送数据后向上层反馈，pData为数据指针，uSize为其长度；107、108主要用于记录日志，以便系统查错或与油机间出现错误或故障时核查原因；
//109: 通知回叫的交易不存在，pData为指向TMDCTTC的结构，uSize为其长度；
//110: 上传通道最大MDC TTC;
//111: 上传设置上位机授权时段，pData为指向TAUTHCFG;
//112: 上传查上位机授权，pData为指向TNZLADDR;
//113: 上传枪授权结果，pData为指向TAUTHRESULT;
//114: 上传取消授权结果，pData为指向TAUTHRESULT;
//115: 上传集线器硬件信息，pData为指向TDEVINFO;
//---------------------------------------------------------------------------

#endif /* SRC_DATATYPE_H_ */
